package com.example.utils;

import jakarta.annotation.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 限流工具类
 *
 * @auth shanyue
 * @date 2025年06月23日10:07
 */
@Component
public class FlowUtil {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 对指定key进行一次限流操作
     * 如果key在Redis中存在，则表示在限制时间内已执行过，返回false
     * 如果key不存在，则设置key，并在指定时间内阻止重复操作，返回true
     *
     * @param key       唯一标识
     * @param blockTime 限制时间，表示在此时间内相同的key的操作会被拒接
     * @return 若key首次出现，返回true，表示操作可以继续，否则返回false
     */
    public boolean limitOnceCheck(String key, int blockTime) {
        if (Boolean.TRUE.equals(stringRedisTemplate.hasKey(key))) {
            //key存在，限流中，拒绝操作
            return false;
        } else {
            stringRedisTemplate.opsForValue().set(key, "", blockTime, TimeUnit.SECONDS);
            //key不存在，设置key并指定过期时间，允许操作
            return true;
        }
    }

}
